package com.xzzz.irda.codegen.pojo;

import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

/**
 * 表的列信息
 *
 * @author xzzz
 * 
 */
@TableName("information_schema.columns")
@Data
public class ColumnDO {
	@TableId
	private Long id;

	/**
	 * 列名
	 */
	private String columnName;

	/**
	 * 示例值
	 */
	private String egValue;

	/**
	 * 列的默认值
	 */
	private String columnDefault;

	/**
	 * 是否有 unsigned 标记
	 * tinyint：有 unsigned 最大值为 255， 没有 unsigned 最大值为 127
	 */
	private String unsignedFlag;

	/**
	 * 列是否可以为 null ：NO、YES
	 */
	private String nullAble;

	/**
	 * 列数据类型：MySql单行最大数据量为64K
	 * <p>
	 * tinyint：	1 byte	有符号范围：(-128，127)									无符号范围：(0，255)
	 * smallint：	2 bytes	有符号范围：(-32768，32767)								无符号范围：(0，65535)
	 * MEDIUMINT	3 bytes	有符号范围：(-8388608，8388607)							无符号范围：(0，16777215)
	 * NT或INTEGER	4 bytes	有符号范围：(-2147483648，2147483647)						无符号范围：(0，4294967295)
	 * bigint：	8 bytes	有符号范围：(-9223372036854775808，9223372036854775807)	无符号范围：(0，18446744073709551615)
	 * decimal：
	 * <p>
	 * BIT(1) 		对应的 Java 数据类型：java.lang.Boolean
	 * BIT( > 1)  	对应的 Java 数据类型：byte[]
	 * <p>
	 * DATE		3	范围：1000-01-01/9999-12-31						格式：YYYY-MM-DD
	 * TIME		3	范围：'-838:59:59'/'838:59:59'					格式：HH:MM:SS
	 * YEAR		1	范围：1901/2155									格式：YYYY			年份值
	 * DATETIME	8	范围：1000-01-01 00:00:00/9999-12-31 23:59:59	格式：YYYY-MM-DD HH:MM:SS	混合日期和时间值
	 * TIMESTAMP	4	范围：1970-01-01 00:00:00/2038 结束时间是第 2147483647 秒，
	 * 北京时间 2038-1-19 11:14:07，格林尼治时间 2038年1月19日 凌晨 03:14:07
	 * 格式：	YYYYMMDD HHMMSS	混合日期和时间值，时间戳
	 * <p>
	 * CHAR		0-255 bytes			定长字符串
	 * VARCHAR		0-65535 bytes		变长字符串
	 * varchar(M)，当M范围为0<=M<=255时会专门有一个字节记录varchar型字符串长度，当M>255时会专门有两个字节记录varchar型字符串的长度，把这一点和上一点结合，那么65535个字节实际可用的为65535-3=65532个字节
	 * 所有英文无论其编码方式，都占用1个字节，
	 * 对于gbk编码，一个汉字占两个字节，因此最大M=65532/2=32766；
	 * 对于utf8编码，一个汉字占3个字节，因此最大M=65532/3=21844，上面的结论都成立
	 * 举一反三，对于utfmb4编码方式，1个字符最大可能占4个字节，那么varchar(M)，M最大为65532/4=16383
	 * TINYBLOB	0-255 bytes			不超过 255 个字符的二进制字符串
	 * TINYTEXT	0-255 bytes			短文本字符串
	 * BLOB		0-65535 bytes		二进制形式的长文本数据
	 * TEXT		0-65535 bytes		长文本数据
	 * MEDIUMBLOB	0-16777215bytes		二进制形式的中等长度文本数据
	 * MEDIUMTEXT	0-16777215bytes		中等长度文本数据
	 * LONGBLOB	0-4294967295bytes	二进制形式的极大文本数据
	 * LONGTEXT	0-4294967295bytes	极大文本数据
	 * <p>
	 * <p>
	 * 注意：
	 * 1、BIGINT(M)的数据类型定义中，M代表需要显示的数字的位数，该值大小并不会对数据类型所能承载的值范围有影响。
	 * 对于宽度M的设定，如果该列的数据位数没有达到M位，那么会从左使用空格补齐，如果该列数据已经超出M位，也不会影响数据的正常显示。
	 * 数据的宽度补齐默认使用空格，在列声明时，添加ZEROFILL可以使用0进行补齐，如下建表语句使用ZEROFILL进行填充：
	 * <p>
	 * 2、在声明数据类型数据时，可以对列进行参数设置，如：
	 * 1、ZEROFILL，当宽度左侧补充时，用0替代空格；
	 * 2、UNSIGNED，设置该列类型为无符号属性，不允许存在负值；
	 * 3、NOT NULL，该列不允许为空；
	 * 4、AUTO_INCREMENT，设置整型和浮点型自增；
	 * <p>
	 * 3、数据类型之间的区别：
	 * 1、当varchar(M)的M大于某些数值时，varchar会自动转为text：
	 * M>255时转为tinytext
	 * M>500时转为text
	 * M>20000时转为mediumtext
	 * 2、所以过大的内容varchar和text没有区别，同事varchar(M)和text的区别在于：
	 * 单行64K即65535字节的空间，varchar只能用63352/65533个字节，但是text可以65535个字节全部用起来
	 * text可以指定text(M)，但是M无论等于多少都没有影响
	 * text不允许有默认值，varchar允许有默认值
	 * 3、varchar和text两种数据类型，使用建议是能用varchar就用varchar而不用text（存储效率高）。
	 * varchar(M)的M有长度限制，如果大于限制，可以使用mediumtext（16M）或者longtext（4G）。
	 * <p>
	 * 4、至于text和blob，简单过一下就是 text 存储的是字符串而 blob 存储的是二进制字符串，
	 * 简单说 blob 是用于存储例如图片、音视频这种文件的二进制数据的。
	 */
	private String dataType;

	//NUMERIC_SCALE numericScale, COLUMN_COMMENT columnComment, DATETIME_PRECISION datetimePrecision, EXTRA extra

	/**
	 * 期望的：数据长度
	 */
	private String dataLength;

	/**
	 * 实际数据库中字符串的最大长度
	 */
	private String strMaxLength;

	/**
	 * 整数的位数：numericPrecision-numericScale
	 */
	private String numericPrecision;

	/**
	 * 小数位数
	 */
	private String numericScale;

	/**
	 * 列的备注信息
	 */
	private String columnComment;

	/**
	 * 日期时间精度
	 */
	private String datetimePrecision;

	/**
	 * 额外信息
	 */
	private String extra;

//	/**
//	 * 属性名称(第一个字母大写)，如：user_name => UserName
//	 */
//	@TableField(exist = false)
	private String attrName;

//	/**
//	 * 属性名称(第一个字母小写)，如：user_name => userName
//	 */
//	@TableField(exist = false)
	private String attrType;

//	/**
//	 * 最大值
//	 */
//	@TableField(exist = false)
	private String maxValue;


	/**
	 * 列的索引信息(主键、唯一索引等)
	 */
	//private String columnKey;
}
